// 导入数据库帮助工具，用于处理数据库操作
const dbHelper = require('../../utils/dbHelper.js');
// 已弃用的直接数据库操作方式
// const db = wx.cloud.database(); // 不再需要直接操作 db 创建班级

Page({
  // 页面的初始数据
  data: {
    userInfo: null,      // 用户信息对象
    isLogin: false,      // 登录状态标志
    isEditing: false,    // 编辑状态标志
    showClassManager: false, // 班级管理器显示状态
    // 性别选择器的选项列表
    genderOptions: [
      { id: 0, name: '未知' },
      { id: 1, name: '男' },
      { id: 2, name: '女' }
    ],
    // 编辑表单数据
    editForm: {
      avatarUrl: '',     // 头像URL
      gender: 0,         // 性别(0:未知, 1:男, 2:女)
      class: '',         // 学生班级名称
      phone: '',         // 电话号码
      dormitory: '',     // 宿舍号码
      remark: ''         // 备注信息
    },
    classInput: '',      // 新增班级名称输入
    classes: [],         // 老师管理的班级名称列表
    // allClasses: [],   // 移除 - 不再从集合加载
    // managedClassDetails: [], // 移除 - 直接使用名称数组
    // loadingClasses: false // 移除
  },

  // 页面加载时执行，检查登录状态
  onLoad: function (options) {
    this.checkLoginStatus();
  },

  // 页面显示时执行，检查登录状态
  onShow: function () {
    this.checkLoginStatus();
    // 确保在检查登录状态后，如果需要，再加载班级列表
    // if (this.data.isLogin && this.data.userInfo.role === 'teacher') {
    //   this.loadClassList(); // 移到 openClassManager 中，避免不必要的加载
    // }
  },

  // 检查用户登录状态并设置相关数据
  checkLoginStatus: function () {
    const userInfo = wx.getStorageSync('userInfo');
    if (userInfo) {
      // 初始化编辑表单，提取用户的基本信息
      const editForm = {
        avatarUrl: userInfo.avatarUrl || '',
        gender: userInfo.gender || 0,
        phone: userInfo.phone || '',
        // dormitory 和 remark 在下面根据角色设置
        remark: userInfo.remark || '' 
      };
      
      let studentClassDisplay = ''; // 用于学生显示的班级名称或ID
      let teacherClassesNames = []; // 存储教师管理的班级名称

      // 根据不同角色(学生/老师/工作人员)处理班级信息
      if (userInfo.role === 'student') {
        // 学生：classes 应该是 ID 数组，通常只有一个
        if (userInfo.classes && Array.isArray(userInfo.classes) && userInfo.classes.length > 0) {
          studentClassDisplay = userInfo.classes[0]; // 假设存的是ID或可以直接显示的名称
        } else if (userInfo.class) { // 兼容旧数据
           studentClassDisplay = userInfo.class;
           // console.warn("Student using old 'class' field. Recommend migration.");
        }
        editForm.class = studentClassDisplay; // 设置编辑表单的班级初始值
        editForm.dormitory = userInfo.dormitory || ''; // 学生有宿舍号
      } else if (userInfo.role === 'teacher') {
        // 老师：classes 应该是名称数组
        if (userInfo.classes && Array.isArray(userInfo.classes)) {
          teacherClassesNames = userInfo.classes.filter(name => typeof name === 'string' && name); // 过滤无效名称
        } else {
            console.warn("Teacher userInfo lacks valid 'classes' array.");
        }
        editForm.class = ''; // 老师不在此编辑单个班级
        editForm.dormitory = ''; // 老师无宿舍号
      } else {
        // 工作人员：不需要班级和宿舍信息
        editForm.class = '';
        editForm.dormitory = '';
      }

      // 更新页面数据，设置用户信息和登录状态
      this.setData({
        userInfo: userInfo,
        isLogin: true,
        editForm: editForm,
        classes: teacherClassesNames // 更新老师管理的班级名称列表
      });

    } else {
      // 未登录状态，重置所有相关数据
      this.setData({
        isLogin: false,
        userInfo: null,
        classes: [],
        editForm: { // 重置表单
            avatarUrl: '', gender: 0, class: '', phone: '', dormitory: '', remark: ''
        }
      });
    }
  },

  // 加载所有班级列表(用于选择器)
  async loadClassList() {
    // 避免重复加载或正在加载时再次触发
    if (this.data.loadingClasses) return; 
    this.setData({ loadingClasses: true });
    
    try {
      // 显示加载提示，并添加mask防止误触
      wx.showLoading({ title: '加载班级...', mask: true });
      // 从数据库获取班级列表
      const classes = await dbHelper.getClassList();
      console.log('获取到的所有班级列表:', classes);
      
      // 更新页面数据
      this.setData({
        allClasses: classes || [], // 确保是数组
        loadingClasses: false
      });
      wx.hideLoading();
    } catch (error) {
      // 错误处理：记录错误并提示用户
      console.error('加载班级列表失败', error);
      this.setData({ loadingClasses: false });
      wx.hideLoading();
      wx.showToast({ title: '加载班级失败', icon: 'none' });
    }
  },

  // 跳转到登录页面
  goToLogin: function () {
    wx.navigateTo({
      url: '/pages/login/login',
    });
  },
  
  // 开始编辑个人信息
  startEdit: function() {
    // 未登录则跳转到登录页
    if (!this.data.isLogin) {
      this.goToLogin();
      return;
    }
    
    // 从当前用户信息重新填充编辑表单，确保数据最新
    const userInfo = this.data.userInfo;
    const editForm = {
      avatarUrl: userInfo.avatarUrl || '',
      gender: userInfo.gender || 0,
      phone: userInfo.phone || '',
      remark: userInfo.remark || ''
    };

    // 根据用户角色设置不同的表单字段
    if (userInfo.role === 'student') {
      let studentClassDisplay = '';
       if (userInfo.classes && Array.isArray(userInfo.classes) && userInfo.classes.length > 0) {
          studentClassDisplay = userInfo.classes[0]; 
        } else if (userInfo.class) { 
           studentClassDisplay = userInfo.class;
        }
      editForm.class = studentClassDisplay; 
      editForm.dormitory = userInfo.dormitory || '';
    } else {
      // 非学生用户不需要设置班级和宿舍信息
      editForm.class = '';
      editForm.dormitory = '';
    }

    // 更新页面状态，进入编辑模式
    this.setData({
      isEditing: true,
      editForm: editForm
    });
  },
  
  // 取消编辑，退出编辑模式
  cancelEdit: function() {
    this.setData({
      isEditing: false
    });
  },
  
  // 性别选择器变化处理函数
  onGenderChange: function(e) {
    this.setData({
      'editForm.gender': parseInt(e.detail.value)
    });
  },
  
  // 班级输入框变化处理函数
  onClassInput: function(e) {
    this.setData({
      'editForm.class': e.detail.value
    });
  },
  
  // 电话输入框变化处理函数
  onPhoneInput: function(e) {
    this.setData({
      'editForm.phone': e.detail.value
    });
  },
  
  // 宿舍输入框变化处理函数
  onDormitoryInput: function(e) {
    this.setData({
      'editForm.dormitory': e.detail.value
    });
  },
  
  // 备注输入框变化处理函数
  onRemarkInput: function(e) {
    this.setData({
      'editForm.remark': e.detail.value
    });
  },
  
  // 计算管理的班级详情（已不再使用）
  computeManagedClassDetails: function() {
    const { classes, allClasses } = this.data;
    if (!Array.isArray(classes) || !Array.isArray(allClasses)) return; // 防御性检查
    
    // 将班级ID映射为班级名称
    const details = classes.map(classId => {
      const classInfo = allClasses.find(c => c._id === classId);
      return {
        id: classId,
        name: classInfo ? (classInfo.name || '未知名称') : `(未知 ID: ${String(classId).substring(0,6)}...)`
      };
    });
    this.setData({ managedClassDetails: details });
  },

  // 打开班级管理器模态框
  openClassManager: function() {
    // 仅老师可以管理班级
    if (this.data.userInfo.role === 'teacher') {
       // 确保使用最新的用户信息
       const userInfo = wx.getStorageSync('userInfo');
       
       // 直接从用户信息中获取班级列表
       let teacherClasses = [];
       if (userInfo && userInfo.classes && Array.isArray(userInfo.classes)) {
          teacherClasses = userInfo.classes;
       }
       
       // 更新数据并显示班级管理器
       this.setData({ 
          userInfo: userInfo, // 更新用户信息
          classes: teacherClasses, // 更新班级列表
          showClassManager: true 
       });
    } else {
        // 非教师用户提示无权限
        wx.showToast({ title: '只有教师可以管理班级', icon: 'none'});
    }
  },
  
  // 关闭班级管理器模态框
  closeClassManager: function() {
    this.setData({
      showClassManager: false,
      classInput: ''  // 清空输入框
    });
  },
  
  // 班级输入框变化处理函数
  onClassInputChange: function(e) {
    this.setData({
      classInput: e.detail.value
    });
  },
  
  // 添加教师管理的班级（输入新名称时）
  addTeacherClass() {
    const className = this.data.classInput.trim();
    // 输入验证：名称不能为空
    if (!className) {
      wx.showToast({ title: '请输入班级名称', icon: 'none' });
      return;
    }
    
    // 验证：不能添加重复的班级名称
    if (this.data.classes.includes(className)) {
      wx.showToast({ title: '该班级已在您的管理列表', icon: 'none' });
      return;
    }

    // 添加新班级到列表并清空输入框
    const newClasses = [...this.data.classes, className];
    this.setData({
      classes: newClasses,
      classInput: ''
    });
    wx.showToast({ title: '添加成功', icon: 'success', duration: 1000 });
  },
  
  // 从教师的管理列表中移除班级
  removeTeacherClass: function(e) {
    const index = e.currentTarget.dataset.index;
    // 验证索引的有效性
    if (index === undefined || index < 0 || index >= this.data.classes.length) {
        console.error("移除班级时索引无效", index);
        return;
    }
    const classNameToRemove = this.data.classes[index]; // 获取要移除的名称

    // 显示确认对话框
    wx.showModal({
        title: '确认移除',
        content: `确定要将班级 "${classNameToRemove}" 从您的管理列表移除吗？`,
        success: (res) => {
            if (res.confirm) {
                // 用户确认后，从列表中移除该班级
                const newClasses = [...this.data.classes];
                newClasses.splice(index, 1); 
                this.setData({
                  classes: newClasses
                });
                wx.showToast({ title: '移除成功', icon: 'success', duration: 1000 });
            }
        }
    });
  },
  
  // 保存班级设置（按钮触发）
  saveClassSettings: function() {
    this.saveUserClasses(); // 调用保存函数
  },
  
  // 保存用户班级信息（仅教师使用，保存名称数组）
  async saveUserClasses() {
    // 验证用户角色
    if (!this.data.userInfo || this.data.userInfo.role !== 'teacher') {
        wx.showToast({ title: '非教师无法操作', icon: 'none' });
        return;
    }
      
    try {
      // 显示加载提示
      wx.showLoading({ title: '保存中...', mask: true });
      
      // 准备更新数据，只更新classes数组
      const updateData = {
        classes: this.data.classes 
      };
      
      // 获取用户OpenID
      const openid = this.data.userInfo?._openid || this.data.userInfo?.openid;
      if (!openid) throw new Error('无法获取用户 OpenID');
      
      // 更新用户数据到数据库
      await dbHelper.updateUser(openid, updateData);
      
      // 更新本地存储的用户信息
      const updatedUserInfo = {
        ...this.data.userInfo,
        classes: this.data.classes
      };
      
      wx.setStorageSync('userInfo', updatedUserInfo);
      
      // 更新页面数据并关闭管理器
      this.setData({
        userInfo: updatedUserInfo,
        showClassManager: false
      });
      
      wx.hideLoading();
      wx.showToast({ title: '保存成功', icon: 'success' });

    } catch (error) {
       // 错误处理
       wx.hideLoading();
       console.error('保存班级信息失败', error);
       wx.showToast({ title: `保存失败: ${error.message || '请重试'}`, icon: 'none', duration: 2000 });
    }
  },
  
  // 保存用户信息（编辑表单的保存按钮）
  async saveUserInfo() {
    // 验证登录状态
    if (!this.data.isLogin) {
      wx.showToast({ title: '请先登录', icon: 'none' });
      return;
    }
    
    try {
      // 显示加载提示
      wx.showLoading({ title: '保存中...', mask: true });
      
      // 构建通用更新数据
      let updateData = {
        avatarUrl: this.data.editForm.avatarUrl,
        gender: this.data.editForm.gender,
        phone: this.data.editForm.phone,
        remark: this.data.editForm.remark
      };
      
      // 根据用户角色处理特定字段
      if (this.data.userInfo.role === 'student') {
        // 学生：更新班级和宿舍信息
        updateData.classes = this.data.editForm.class ? [this.data.editForm.class] : []; 
        updateData.dormitory = this.data.editForm.dormitory;
        if ('class' in updateData) delete updateData.class; // 确保不写入旧字段
      } 
      // 教师的班级在 saveUserClasses 中处理，这里不处理
      // 工作人员没有班级和宿舍
      
      // 获取用户OpenID
      const openid = this.data.userInfo?._openid || this.data.userInfo?.openid;
       if (!openid) {
          throw new Error('无法获取用户 OpenID');
      }

      // 更新用户数据到数据库
      await dbHelper.updateUser(openid, updateData);
      
      // 更新本地存储的用户信息
      const currentUserInfo = wx.getStorageSync('userInfo') || {}; // 获取当前存储
      const updatedUserInfo = {
        ...currentUserInfo, // 基于当前存储更新
        ...updateData // 合并通用更新
      };
      
      // 如果是学生，确保本地存储的 classes 也更新了
      if (updatedUserInfo.role === 'student') {
          updatedUserInfo.classes = updateData.classes;
          // 考虑删除旧字段
          if ('class' in updatedUserInfo) delete updatedUserInfo.class; 
      }
      
      // 保存到本地存储
      wx.setStorageSync('userInfo', updatedUserInfo);
      
      // 更新页面数据并退出编辑模式
      this.setData({
        userInfo: updatedUserInfo,
        isEditing: false
      });
      
      wx.hideLoading();
      wx.showToast({ title: '保存成功', icon: 'success' });

    } catch (error) {
      // 错误处理
      wx.hideLoading();
      console.error('保存用户信息失败', error);
      wx.showToast({ title: `保存失败: ${error.message || '请重试'}`, icon: 'none', duration: 2000 });
    }
  },

  // 处理选择头像事件
  onChooseAvatar(e) {
    const { avatarUrl } = e.detail;
    if (avatarUrl) {
        // 获取头像URL并更新到编辑表单
        this.setData({
            'editForm.avatarUrl': avatarUrl
        });
        // 注：实际应用中可能需要上传到云存储获取永久链接
    }
  },
  
  // 用于阻止事件冒泡的空函数
  noop() {
    // 什么都不做，用于阻止事件冒泡
  }
}) 